iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
1


↑ 雪兔哥,先不要

前情提要

在進入今天的課程之前我想補充一下 Golang 變數的特性,可能有人有發現,當 Golang 宣告的變數沒有使用時,編譯器就會噴錯,在一般的程式語言中(rust除外)通常都不會有這種情形,但是這樣子的設計可以避免魔法使在製作大張Golang牌時不斷修改咒語的情況下,沒有把那些宣告了又不用的變數刪除掉。

package main
import "fmt"
func main(){
    a := "ほら Catch You Catch You"
    b := "Catch Me Catch Me 待って"
    fmt.Println(a)
}

執行結果:
b declared and not used

翻譯年糕:b 宣告了但沒有被使用

流程控制

各位魔法使們目前為止應該能大致了解變數和Print的使用了,但是,我們的程式只能從一開始逐行執行?有沒有什麼方法是可以做到「選擇」的方法呢?

請設計一支程式在 num 大於 10 的時候印出 小可

在Golang中,要能在「一定條件下做特定的事」,就要使用 if 來實現,if 的意思就是如果。請觀察下面這支程式

package main
import "fmt"
func main(){
    num := 20
    if(num > 10){
        fmt.Println("小可")
    }
}

執行結果:
小可

直接看的話應該就能懂了,當 num > 10 程式就會執行 { } 間的程式碼。各位初學者可以試著把 num 調成其他值。

如果今天想要實現一支程式在 num 大於 10 的時候印出 小可,否則印出 小櫻

這時就要再介紹一個關鍵字,叫 else 中文稱「否則」,直接看範例應該就能懂了

package main
import "fmt"
func main(){
    num := 5
    if num > 10 {
        fmt.Println("小可")
    }else{
        fmt.Println("小櫻")
    }
}

執行結果:
小櫻

num > 10 這個條件沒有通過時,程式就會往 else 走,並進入 { } 裡面

如果今天想要實現一支程式在 num 大於 10 的時候印出 小可,否則(沒大於 10 時),如果大於 5 印出 小櫻

package main
import "fmt"
func main(){
    num := 8
    if num > 10 {
        fmt.Println("小可")
    }else{
        if num > 5 {
            fmt.Println("小櫻")
        }
    }
}

執行結果:
小櫻

這時你可以在否則的情況下再塞入一個 if{} 來控製程式,因為現在我們設定 num 是 8,因為第5行 8 > 10 是錯的所以程式會直接來到第7行,進入第8行檢查 8 有沒有大於 5,因為 8 > 5 是對的,所以程式進入第9行並印出小櫻

因為這樣寫比較麻煩,所以可以把程式碼精簡成:

package main
import "fmt"
func main(){
    num := 8
    if num > 10 {
        fmt.Println("小可")
    }else if num > 5 {
        fmt.Println("小櫻")
    }
}

if else if else 可以不斷串接

實現一支程式在 num 等於 1 的時候印出 小可,等於 2 時印出 小櫻 等於 3 時印出 知世 否則印出 桃矢

package main
import "fmt"
func main(){
    num := 8
    if num == 1 {
        fmt.Println("小可")
    }else if num == 2 {
        fmt.Println("小櫻")
    }else if num == 3{
        fmt.Println("知世")
    }else{
        fmt.Println("桃矢")
    }
}

執行結果:
桃矢

布林變數

if - else if 究竟是以什麼方式做為要不要進入 { }

其實在做比較時 >(大於), ==(等於), <(小於), >=(大於等於), <=(小於等於),會產生一個值,稱為「布林值」(boolean),這個值只有兩種:「真」(true)、「假」(flase)

我們常常說「真的假的」,就是把兩種布林值講了一遍

這次,我們直接將在 if 右邊的條件換成布林變數看看

package main
import "fmt"
func main(){
    // 宣告布林變數
    var a bool
    a = true
    if a {
        fmt.Println("a is true")
    }else{
        fmt.Println("a is false")
    }
}

執行結果:
a is true

package main
import "fmt"
func main(){
    var a bool
    a = false
    if a {
        fmt.Println("a is true")
    }else{
        fmt.Println("a is false")
    }
}

執行結果:
a is false

布林的運算

NOT

布林還能有什麼運算呢?首先要有 not 也就是讓 truefalsefalsetrue

只要在布林變數前加上 ! 就可以實現

package main
import "fmt"
func main(){
    // 利用 := 快速宣告
    a := true
    fmt.Println(!a)
    fmt.Printf("%t", !a)
}

執行結果:
false
false

布林變數可以直接印出,若要用 Printf 來印出可以用 %t t 是指 true 因為 %b 的 b 被拿去當 binary 印二進位了,所以要印出布林變數要用 %t

AND

當兩件事情同時是 true 時則 AND 的結果也是 true,AND 可以用中文想成「而且」,在 Golang 及大多數程式語言中(python除外),我們用 && 來表示「而且」,舉個例子

小可是封印之獸「而且」小櫻是庫洛魔法使

  1. 「小可是封印之獸」 這件是是對的
  2. 「小櫻是庫洛魔法使」 這件是是對的

所以:小可是封印之獸「而且」小櫻是庫洛魔法使→也是對的

但今天若換成

小可有雙眼皮「而且」小櫻是庫洛魔法使

  1. 「小可有雙眼皮」 這件是是錯的
  2. 「小櫻是庫洛魔法使」 這件是是對的

那麼:小可有雙眼皮「而且」小櫻是庫洛魔法使→則是錯的

package main
import "fmt"
func main(){
    fmt.Println(false && false)
    fmt.Println(false && true)
    fmt.Println(true && false)
    fmt.Println(true && true)
}

執行結果:
false
false
false
true

OR

當兩件事情只要有一件是 true 時,則 OR 的結果就會 true,AND 可以用中文想成「或者」,在 golang 及大多數程式語言中,我們用 || 來表示「或者」,舉個例子

小櫻是啦啦隊「或者」知世是合唱團

  1. 「小櫻是啦啦隊」 這件事是對的
  2. 「知世是合唱團」 這件事是對的

所以:小櫻是啦啦隊「或者」知世是合唱團→也是對的

今天若換成

小櫻是學生會會長「或者」知世是合唱團

  1. 「小櫻是學生會會長」 這件事是錯的
  2. 「知世是合唱團」這件事是對的

雖然只有條件 2 對,但因為是「或者」,所以:小櫻是學生會會長「或者」知世是合唱團→是對的

今天若換成

小櫻是學生會會長「或者」知世是熱舞社的

  1. 「小櫻是學生會會長」 這件事是錯的
  2. 「知世是熱舞社」這件事是錯的

在兩件都是錯的情況下:小櫻是學生會會長「或者」知世是熱舞社的→是錯的

package main
import "fmt"
func main(){
    fmt.Println(false || false)
    fmt.Println(false || true)
    fmt.Println(true || false)
    fmt.Println(true || true)
}

執行結果:
false
true
true
true

範例

老師講解

試著實作一支程式,給定一個數字 num 型態 int,能在 num 是偶數時印出 evennum 是奇數時印出 odd

要判斷奇偶數的方法可以先利用 % 的方法取餘數,但是這個部份我前天忘記教,但已經補上了:#2 零與壹的魔法世界 ── 宣告數字型態的變數 | Golang魔法使

package main
import "fmt"
func main(){
    num := 10
    if num % 2 == 1{
        fmt.Println("odd")
    }else{
        fmt.Println("even")
    }
}

學生練習

試著實作一支程式,給定一個數字 num 型態 int,能在 num 是正數時印出 +num 是負數時印出 - 否則若都不是印出 0

switch - case

當一次要比較同一個變數很多次時,可以改用 switch case 改寫

實現一支程式在 num 等於 1 的時候印出 小可,等於 2 時印出 小櫻 等於 3 時印出 知世 否則印出 桃矢

package main
import "fmt"
func main(){
    num := 3
    switch num {
    case 1:
        fmt.Println("小可")
    case 2:
        fmt.Println("小櫻")
    case 3:
        fmt.Println("知世")
    default:
        fmt.Println("桃矢")
    }
}

執行結果:
知世

default 可有可無,其功能類似於 else,另外要提到一點在Golang魔法中,使用 switch-case 不需要搭配 break,常見經典的魔法比如 C, C++, Java, PHP, Javascritp 這些經典的魔法都必需要加 break;比較現代的魔法則有很多類似的語法,也不用加 break 比如Rust的 match 、Kotlin 的 when、Coffeescript 的 switch-when-then...

另外,如果想要用 switch-case 實現:
如果 num 是 1 或者是 2 時要印出小可 是 3 或者 4 時要印出 小櫻 又要怎麼達成呢?

package main
import "fmt"
func main(){
    num := 3
    switch num {
        case 1:
            fmt.Println("小可")
        case 2:
            fmt.Println("小可")
        case 3:
            fmt.Println("小櫻")
        case 4:
            fmt.Println("小櫻")
    }
}

在這種情況下可以精簡成下面這種寫法

package main
import "fmt"
func main(){
    num := 2
    switch num {
    case 1, 2:
        fmt.Println("小可")
    case 3, 4:
        fmt.Println("小櫻")
    }
}

更多switch-case用法
5 switch statement patterns

引戰

邏輯運算是非常直覺易懂的事,如果你覺得很難懂,那你可能很適合當法官。

吸毒→有罪
殺人→有罪
先吸毒後殺人→無罪

法官邏輯真他媽好

https://www.setn.com/News.aspx?NewsID=802491


本文多數圖片來自:


上一篇
#3 字串 ─ 知世:反正我們是屬於正義的一方 | Golang魔法使
下一篇
#5 For 迴圈流程控制 | Golang魔法使
系列文
Golang魔法使 ─ 30天從零開始學習Go語言 | 比Python還簡單 | 理科生一定學得會 | 文科生不好說30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言